﻿using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Net;
using System.Text;
using System.Xml;

namespace iNet.Net
{
	/// <summary>
	/// XML 網路文件下載工作。
	/// </summary>
	public class XmlWebDocumentDownloadTask : WebDocumentDownloadTask
	{
		#region 欄位
		bool _DeleteLocalFile = true;
		XmlDocument _XmlDocument;
		#endregion
		#region 建構子
		/// <summary>
		/// 初始化新的 XmlWebDocumentDownloadTask 執行個體。
		/// </summary>
		public XmlWebDocumentDownloadTask()
		{ }
		/// <summary>
		/// 初始化新的 XmlWebDocumentDownloadTask 執行個體。
		/// </summary>
		/// <param name="request">XML 網路文件的伺服器請求。</param>
		public XmlWebDocumentDownloadTask(WebRequest request)
			: base(request)
		{ }
		#endregion
		#region DeleteLocalFile
		/// <summary>
		/// 取得或設定讀取文字內容完成後，是否刪除已下載至本機的檔案，預設值為 True。
		/// </summary>
		public bool DeleteLocalFile
		{
			get
			{
				return _DeleteLocalFile;
			}
			set
			{
				this.SetInitializingParameter<bool>(ref _DeleteLocalFile, value);
			}
		}
		#endregion
		#region Execute
		protected override bool Execute(Tasks.TaskVersion version)
		{
			//取得初始化參數
			bool deleteLocalFile;
			if (!this.ReadValue<bool>(version, ref _DeleteLocalFile, out deleteLocalFile))
				return true;

			//下載至本機
			if (!base.Execute(version))
				return false;

			//分析 XML 文件
			try
			{
				//分析 XML 文件
				XmlDocument xmlDocument = new XmlDocument();
				try
				{
					using (FileStream stream = new FileStream(this.LocalFileName, FileMode.Open, FileAccess.Read))
						xmlDocument.Load(stream);
				}
				catch (XmlException ex)
				{
					return false;
				}

				//儲存結果
				this.WriteValue<XmlDocument>(version, ref _XmlDocument, xmlDocument);
			}
			catch
			{
				return false;
			}
			finally
			{
				//刪除本機檔案
				if (deleteLocalFile)
				{
					try
					{
						File.Delete(this.LocalFileName);
					}
					catch
					{ }
				}
			}

			//完成
			return true;
		}
		#endregion
		#region ResetOverride
		protected override void ResetOverride()
		{
			//呼叫基底
			base.ResetOverride();

			//重設參數
			_XmlDocument = null;
		}
		#endregion
		#region XmlDocument
		/// <summary>
		/// 取得已下載並分析的 XML 文件。
		/// </summary>
		public XmlDocument XmlDocument
		{
			get
			{
				return _XmlDocument;
			}
		}
		#endregion
	}
}
